#/usr/bin/python
#-*-<coding=UTF-8>-*-

"""
本例展示了wxPython事件驱动的工作原理.有几外重要的术语需要先理解:
    事件(event):		在应用程序生命周期内发生的事情,它要求有一个响应;
    事件对象(event object):	在wxPython中,它具体代表一个事件,其中包括了事件的数据等属性.它是类wx.Event或其子类的实例.
				子类如wx.CommandEvent和wx.MouseEvent
    事件类型(event type):	wxPython分配给每个事件对象的一个整数ID.事件类型给出了关于该事件本身更多的信息.如:
				wx.MouseEvent的事件类型标识了该事件是一个鼠标单击还是一个鼠标移动.
    事件源(event source):	任何wxPython对象都能产生事件. 例如按钮,菜单,列表框和任何别的窗口部件;
    事件驱动(event driven):	一个程序结构,它的大部分时间花在等待或响应事件上.
    事件队列(event queue):	以发生的但是未处理的事件的一个列表.
    事件处理器(event handle):	响应事件时所调用的函数或方法.也称作处理器函数或处理器方法.
    事件绑定器(event binder):	一个封装了特定窗口部件,特定事件类型和一个事件处理器的wxPython对象.
				为了被调用,所有事件处理器必须用一个事件绑定器注册.
    wx.EvtHandler:		一个wxPython类,它允许它的实例在一个特定类型,一个事件源和一个事件处理器之间创建绑定.
				注意,这个类与之前定义的事件处理函数或方法不是同一个东西.
"""

import wx

class Frame(wx.Frame):
    
    def __init__(self):
	wx.Frame.__init__(self,parent=None,id=-1,title="",pos=wx.DefaultPosition,size=wx.DefaultSize)
	panel = wx.Panel(self,-1)
	button = wx.Button(panel,-1,"Close",pos=(130,15),size=(40,40))
	#绑定器函数Bind(), 将wx.EVT_CLOSE与事件处理函数OnCloseWindow绑定起来.
	#为什么此处可以不指定事件源呢? 而且注释掉此语句,点击关闭按钮,也没有什么影响.
	self.Bind(wx.EVT_CLOSE,self.OnCloseWindow)
	
	#绑定器函数Bind(), 将wx.EVT_BUTTON与事件处理函数OnCloseMe绑定起来.
	#此处指定事件源为button. 主要为了区分是该按钮产生的事件还是其它控件产生的事件.
	self.Bind(wx.EVT_BUTTON,self.OnCloseMe,button)

    def OnCloseWindow(self,event):
	self.Destroy()

    def OnCloseMe(self,event):
	self.Close(True)


if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = Frame()
    frame.Show()
    app.MainLoop()
